package cn.zhibang.yygh2.service.sms.service.impl;

import cn.zhibang.yygh2.service.sms.service.SmsService;
import cn.zhibang.yygh2.service.sms.utils.ConstantPropertiesUtils;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class SmsServiceImpl implements SmsService {
    @Override
    public boolean send(String phone, String code) {
        //判断手机号是否为空
        if(StringUtils.isEmpty(phone)) {
            return false;
        }
        //整合阿里云短信服务(复制阿里云提供的java短信服务代码)
        //(1)设置阿里云相关参数（application.yml中配置的）
        DefaultProfile profile = DefaultProfile.getProfile(
                ConstantPropertiesUtils.REGION_Id,
                ConstantPropertiesUtils.ACCESS_KEY_ID,
                ConstantPropertiesUtils.SECRECT);
        //(2)加载相关参数
        IAcsClient client = new DefaultAcsClient(profile);
        //(3)公共请求的参数设置
        CommonRequest request = new CommonRequest();
        //如果发送请求使用的是Https就设置，这里并不是
        //request.setProtocol(ProtocolType.HTTPS);
        //请求方式post
        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25"); //这是API版本号（根据阿里云提供，不能乱改）
        request.setAction("SendSms"); //执行的方法（不改）
        //手机号
        request.putQueryParameter("PhoneNumbers", phone); //接收的手机号参数
        //签名名称，这里填阿里云申请的签名管理，正式开发使用"在线预约挂号平台"
        request.putQueryParameter("SignName", "徐文波的个人博客");
        //模板code编号（看阿里云短信模版管理中申请通过的）
        request.putQueryParameter("TemplateCode", "SMS_268670985");
        //验证码，需要使用json格式{"code":"123456"}，因此通过Map转换一下
        Map<String, Object> param = new HashMap<>();
        param.put("code", code);
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param));
        try {
            //调用方法进行短信发送
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
            //TODO：如果阿里云短信服务发送成功Code=OK，这里需要判断Code来确认是否发送成功
            //将字符串转换成json对象，获得Code的值是不是OK，如果是OK表示短信发送成功，否则发送失败
            Map map = (Map)JSONObject.parse(response.getData());
            //判断是否发送成功
            if("OK".equals(map.get("Code"))){
                //返回发送成功
                return response.getHttpResponse().isSuccess();
            }
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return false;
    }
}
